package Gather.CollectionExercise;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * ClassName:CollectionText004
 * Package:Gather.CollectionExercise
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/2/6-18:41
 * @Version:v1.0
 */
public class CollectionText004 {
    /*Collection的遍历方式
    * 1.迭代器遍历
    * 2.增强for遍历
    * 3.Lambda表达式遍历*/
    public static void main(String[] args) {
        /*迭代器遍历(在Java中的类是Iterator.迭代器是集合专用的遍历方式)
        * 1.不依赖索引
        *
        * Collection集合获取迭代器
        * Iterator<E> iterator() 返回迭代器对象,默认指向当前集合的0索引
        *
        * Iterator中的常用方法
        * boolean hasNext()  判断当前位置是否有元素,有元素返回True,没有元素返回false
        * E next() 获取当前位置的元素,并将迭代器对象移向下一个位置*/

        //创建集合并添加元素
        Collection<String > coll =new ArrayList<>();
        coll.add("aaa");
        coll.add("bbb");
        coll.add("ccc");
        coll.add("ddd");
        //获取迭代器对象
        //迭代器就好比是一个箭头,默认指向集合的0索引处
        Iterator<String> it =coll.iterator();
        //利用循环不断的去获取集合中的每一个元素
        while (it.hasNext()){
            //next方法的两件事情：获取元素并移动指针
            String str = it.next();
            if ("bbb".equals(str)){
//                coll.remove("bbb");//报错ConcurrentModificationException
                //迭代器中的删除,没有添加
                it.remove();
            }
        }
        System.out.println(coll);
        //当上面循环结束之后,迭代器的指针已经指向了最后没有元素的位置
//        System.out.println(it.next());//NoSuchElementException

        //迭代器遍历完毕,指针不会复位
//        System.out.println(it.hasNext());// false

        //如果我们要继续第二次遍历集合,只能再次获取一个新的迭代器对象
//        Iterator<String> it2 = coll.iterator();
//        while (it2.hasNext()){
//            String str = it2.next();
//            if ("bbb".equals(str)){
//                coll.remove("bbb");//报错ConcurrentModificationException
//                it2.remove();
//            }
//            System.out.println(str);
//        }
    }
    /*
    * 细节注意：
    * 1.报错NoSuchElementException
    * 2.迭代器遍历完毕,指针不会复位
    * 3.循环中只能用一次next方法
    * 4.迭代器遍历时,不能用集合方法进行增加或者删除*/

}
